/************************************************************************
*  vfw_spec.h                                                           *
*                                                                       *
* This code and information is provided "as is" without warranty of     *
* any kind, either expressed or implied, including but not limited to   *
* the implied warranties of merchantability and/or fitness for a        *
* particular purpose.                                                   *
*                                                                       *
*               Copyright (c) 1994-1995 Intel Corporation.              *
*                         All Rights Reserved.                          *
*                                                                       *
************************************************************************/
/*
 *
 *  DESCRIPTION:
 *  The Indeo(R) Video Interactive codec provides access to new features
 *  using the ICM_SETCODECSTATE and ICM_GETCODECSTATE messages. This header
 *  file defines the data structures used in these messages.
 */

/* $Revision:   1.27  $
 */


#ifndef __VFW_SPEC_H__
#define __VFW_SPEC_H__


/* The specific interface version is defined as follows:
 */
#define INTERFACE_MAJOR_NUMBER(v)                       ((v) >> 16)
#define INTERFACE_MINOR_NUMBER(v)                       ((v) & 0xffff)
#define CREATE_INTERFACE_VERSION(maj,min)               ((((DWORD)maj)<<16) | (((DWORD)min) & 0xffff))
#define SPECIFIC_INTERFACE_VERSION                      CREATE_INTERFACE_VERSION(1,2)

/* The codec specific information is handled by the general state
 * handler.
 */
#define ICM_GETCODECSTATE                                       ICM_GETSTATE
#define ICM_SETCODECSTATE                                       ICM_SETSTATE
#define EXTENDED_INTERFACE_SIZE                                 1

/* OS Environments - Within the Microsoft Windows domain (Win 3.1, Win 95,
 * and Win NT), both applications and codecs can be compiled in either 16 or
 * 32-bit formats.  Any combination is allowed with the knowledge that data
 * pointers will not be thunked.
 */
typedef enum {
        OE_UNDEFINED,
        OE_16,
        OE_32,
} R4_OS_ENVIRONMENT;


/* The type field identifies the kind of operation that should be done as part
 * of the ICM_GETCODECSTATE and ICM_SETCODECSTATE messages.
 *
 * The MT_UNDEFINED value is not a supported type - it should only be used
 * to initialize variables to an "undefined" state.
 */
typedef enum {
        MT_UNDEFINED,
        MT_DECODE_FRAME_DEFAULT,
        MT_DECODE_FRAME_VALUE,
        MT_DECODE_SEQ_DEFAULT,
        MT_DECODE_SEQ_VALUE,
        MT_ENCODE_SEQ_DEFAULT,
        MT_ENCODE_SEQ_VALUE,
        MT_DECODE_INIT_DATA
} R4_MESSAGE_TYPE;

/*
 * MT_QUEUE is for 16-bit applications that call 32-bit codecs, only.  It
 * is necessary to pre-set ICM_GETCODECSTATE messages by first issuing an
 * ICM_SETCODECSTATE with the MT_QUEUE flag or'ed with the desired
 * message type to get.  The ICM_GETCODECSTATE message which follows
 * must set its dwFourCC field to 0.
 */
#define MT_QUEUE  (1UL<<31)

/* UCHAR is defined in Win32 but not Win16 MS* Windows headers.
 */
#if !defined UCHAR
typedef unsigned char UCHAR;
#endif

/* A flag is false if it is zero, otherwise it is true.
 */
typedef DWORD R4_FLAG;

/* Pointer to a Flag - A pointer to a flag is used by the codec to write
 * status information at a later time.
 */
typedef R4_FLAG FAR * PTR_R4_FLAG;


/* Rectangle - The following structure is used to describe a rectangle.
 */
typedef struct {
        DWORD dwX;
        DWORD dwY;
        DWORD dwWidth;
        DWORD dwHeight;
} R4_RECT, FAR * PTR_R4_RECT;


/* Transparency Bitmask - A transparency bitmask contains one bit for each
 * pixel in the source image. If a bit is zero the data is transparent.
 * The first bit in each byte is identified by the mask 0x80.  The last
 * bit in each byte is identified by the mask 0x01.
 *
 * To allow faster access each row must begin on a DWORD boundary and the
 * total number of bytes must be rounded-up to a multipe of four.
 */
typedef BYTE FAR * PTR_R4_BITMASK;


/* Playback Platform - The codec supports several playback options.  This is
 * not hardware specific.  Instead it rates the relative capabilities of the
 * hardware.
 */
typedef enum {
        PP_LOW,
        PP_MEDIUM,
        PP_HIGH,
} R4_PLAYBACK_PLATFORM;


/* Transparency Method - The codec supports a number of tranparency encoding
 * methods. The enumeration specifies the transparency method.
 */
typedef enum {
        TM_UNDEFINED,
        TM_NONE,
        TM_RANGE,
        TM_BITMASK,
        TM_FRAME,
        TM_ALPHA_CHANNEL                /* XRGB color formats only */
} R4_TRANS_METHOD;


/* Transparency Range - A transparency range is specified using minimum
 * and maximum values for R, G, and B. Any pixel with values within this range
 * (inclusive) is considered transparent.
 */
typedef struct {
        WORD            u16Reserved;
        UCHAR           u8BlueLow;
        UCHAR           u8BlueHigh;
        UCHAR           u8GreenLow;
        UCHAR           u8GreenHigh;
        UCHAR           u8RedLow;
        UCHAR           u8RedHigh;
} R4_RANGE, FAR * PTR_R4_RANGE;


/* The structure header is a set fields that are common,
 * to each of the data structures that follows.
 */
typedef struct {
        DWORD           dwSize;
        DWORD           dwFourCC;
        DWORD           dwVersion;
        LONG            mtType;
        LONG            oeEnvironment;
        DWORD           dwFlags;
} R4_HEADER, FAR * PTR_R4_HEADER;
/* The structure header size is enough room for dwSize, dwFourCC,
 * dwVersion, dwType, dwEnvironment, and dwFlags
 */
#define R4_STRUCTURE_HEADER_SIZE (sizeof(R4_HEADER))


typedef enum {
        OFF,
        LOW,
        MEDIUM,
        HIGH
} R4_DITHER;

/* Some decode parameters can be changed prior to either an ICM_DECOMPRESS or
 * ICM_DECOMPRESSEX mesage. These are found in the  R4_DEC_FRAME_DATA
 * structure.  See CUSTOM_INTERFACE_ENCODER_DATA for structure size constraints.
 */
#define DECFRAME_TIME_LIMIT                     (1UL<<0)
#define DECFRAME_DECODE_RECT                    (1UL<<1)
#define DECFRAME_VIEW_RECT                      (1UL<<2)
#define DECFRAME_BOUNDING_RECT                  (1UL<<3)
#define DECFRAME_TRANS_BITMASK                  (1UL<<4)
#define DECFRAME_BRIGHTNESS                     (1UL<<5)
#define DECFRAME_SATURATION                     (1UL<<6)
#define DECFRAME_CONTRAST                       (1UL<<7)
#define DECFRAME_FILL_COLOR                     (1UL<<9)
#define DECFRAME_8BIT_CONFIG_PALETTE            (1UL<<10)
#define DECFRAME_8BIT_DITHER                    (1UL<<11)
#define DECFRAME_VIEW_RECT_ORIGIN               (1UL<<12)
#define DECFRAME_INPUT_TRANS_MASK               (1UL<<13)
#define DECFRAME_VALID                          (1UL<<31)

/* Signals that the fill color provided is not a defined value */
#define DECFRAME_FILL_UNDEFINED 0xFF000000

typedef struct {
        DWORD           dwSize;
        DWORD           dwFourCC;
        DWORD           dwVersion;
        LONG            mtType;
        LONG            oeEnvironment;
        DWORD           dwFlags;

        DWORD           dwTimeLimit;                            /* version 1.0 */
        R4_RECT         rDecodeRect;                            /* version 1.0 */
        R4_RECT         rViewRect;                              /* version 1.0 */
        PTR_R4_RECT     prBoundingRect;                         /* version 1.0 */
        PTR_R4_BITMASK  pbmTransparencyBitmask;                 /* version 1.0 */
        PTR_R4_FLAG     pfUpdatedTransparencyBitmask;           /* version 1.0 */
        LONG            lBrightness;                            /* version 1.0 */
        LONG            lSaturation;                            /* version 1.0 */
        LONG            lContrast;                              /* version 1.0 */

        DWORD           dwFillColor;                            /* version 1.2 */
        DWORD           dwFirstPalIndex;                        /* version 1.2 */
        DWORD           dwLastPalIndex;                         /* version 1.2 */
        LPRGBQUAD       prgbPalette;                            /* version 1.2 */
        R4_DITHER       eDither;                                /* version 1.2 */
        R4_FLAG         fViewRectOrigin;                        /* version 1.2 */
        PTR_R4_BITMASK  pbmInputTransparencyBitmask;             /* version 1.2 */
} R4_DEC_FRAME_DATA, FAR * PTR_R4_DEC_FRAME_DATA;

/* Turning scalability off completely was accomplished in versions 1.0 and 1.1
 * of the interface by decoding in STEPPING mode.  Setting the scalability
 * flag to false meant not to drop the quality of frames, but frames could
 * still be dropped.  For this reason, if SC_OFF is used, it will map to
 * stepping mode, and SC_DONT_DROP_QUALITY occupies the position of "false."
 */
typedef enum {
        SC_DONT_DROP_QUALITY,
        SC_ON,
        SC_DONT_DROP_FRAMES,
        SC_OFF,
} R4_SCALABILITY;

/* Other decode parameters can only be changed prior to either an
 * ICM_DECOMPRESS_BEGIN or an ICM_DECOMPRESSEX_BEGIN message.  These
 * are found in the R4_DEC_SEQ_DATA structure.
 * See CUSTOM_INTERFACE_ENCODER_DATA for structure size constraints.
 */
#define DECSEQ_KEY                                      (1UL<<0)
#define DECSEQ_SCALABILITY                              (1UL<<1)
#define DECSEQ_FILL_TRANSPARENT                         (1UL<<2)
#define DECSEQ_ALT_LINE                                 (1UL<<3)
#define DECSEQ_VALID                                    (1UL<<31)

typedef struct {
        DWORD           dwSize;
        DWORD           dwFourCC;
        DWORD           dwVersion;
        LONG            mtType;
        LONG            oeEnvironment;
        DWORD           dwFlags;

        DWORD           dwKey;                                  /* version 1.0 */
        R4_FLAG         fEnabledKey;                            /* version 1.0 */
        LONG            eScalability;                           /* version 1.2; 1.0 fScalability */
        R4_FLAG         fFillTransparentPixels;                 /* version 1.0 */
        R4_FLAG         fAltLine;                               /* version 1.1 */
} R4_DEC_SEQ_DATA, FAR * PTR_R4_DEC_SEQ_DATA;


/* Decode persistent data parameters can only be sent prior to the
 * first ICM_DECOMPRESS_BEGIN message. These are found in the
 * R4_DECODE_INIT_DATA structure.
 */
#define DECINIT_VALID                           (3UL<<30)       /* valid bit + one other bit */

typedef struct {
        DWORD           dwSize;
        DWORD           dwFourCC;
        DWORD           dwVersion;
        LONG            mtType;
        LONG            oeEnvironment;
        DWORD           dwFlags;

        R4_FLAG         fBidir;                                 /* version 1.2 */
        R4_FLAG         fDeltaFrames;                           /* version 1.2 */
        R4_FLAG         fTransparency;                          /* version 1.2 */
        DWORD           dwNLevels;                              /* version 1.2 */
        DWORD           dwTileWidth;                            /* version 1.2 */
        DWORD           dwTileHeight;                           /* version 1.2 */
} R4_DECODE_INIT_DATA, FAR * PTR_R4_DECODE_INIT_DATA;


/* Encode parameters can only be changed prior to an ICM_COMPRESS_BEGIN
 * messsage.  These are found in the R4_ENC_SEQ_DATA structure (these
 * include the parameters that can be set in the super dialog box).
 * See CUSTOM_INTERFACE_ENCODER_DATA for structure size constraints.
 */
#define ENCSEQ_KEY                      (1UL<<0)
#define ENCSEQ_MINIMUM_VIEWPORT         (1UL<<1)
#define ENCSEQ_TRANSPARENCY             (1UL<<2)
#define ENCSEQ_SCALABILITY              (1UL<<3)
#define ENCSEQ_BI_DIR_PREDICTION        (1UL<<4)
#define ENCSEQ_PLAYBACK_PLATFORM        (1UL<<5)
#define ENCSEQ_RANDOM_KEY_AND_BIDIR     (1UL<<6)
#define ENCSEQ_FRAME_INFO               (1UL<<7)
#define ENCSEQ_QUICK_COMPRESS           (1UL<<8)
#define ENCSEQ_VALID                    (1UL<<31)

typedef struct {
        DWORD           dwSize;
        DWORD           dwFourCC;
        DWORD           dwVersion;
        LONG            mtType;
        LONG            oeEnvironment;
        DWORD           dwFlags;

        DWORD           dwKey;                                  /* version 1.0 */
        DWORD           dwMinViewportWidth;                     /* version 1.0 */
        DWORD           dwMinViewportHeight;                    /* version 1.0 */
        R4_RANGE        rngTransparencyRange;                   /* version 1.0 */
        PTR_R4_BITMASK  pbmTransparencyBitmask;                 /* version 1.0 */
        LONG            tmTransparencyMethod;                   /* version 1.0 */
        R4_FLAG         fEnabledKey;                            /* version 1.0 */
        R4_FLAG         fScalability;                           /* version 1.0 */
        R4_FLAG         fBiDirPrediction;                       /* version 1.0 */
        R4_FLAG         fRandomKeyAndBiDir;                     /* version 1.0 */
        DWORD           dwPlaybackPlatform;                     /* version 1.0 */
        WORD            wFrameLatency;                          /* version 1.0 */
        WORD            wDeadFrames;                            /* version 1.0 */
        R4_FLAG         fQuickCompress;                         /* version 1.1 */
} R4_ENC_SEQ_DATA, FAR * PTR_R4_ENC_SEQ_DATA;


#endif /* __VFW_SPEC_H__ */
